package cn.tedu.serrch.repository;

import cn.tedu.serrch.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
//Repository是Spring家族框架对持久层出现的类/接口的命名规范
@Repository
public interface IItemRepository extends ElasticsearchRepository<Item,Long> {

//    IItemRepository接口继承SpringData框架提供的ElasticsearchRepository父接口
//    继承之后当前接口就能够使用父接口中声明的操作ES的方法
//    父接口中大方法包含了指定实体类对应ES索引的基本增删改查
//    ElasticsearchRepository<要操作的实体类，实体类的主键类型>


    //    SpringData自定义查询
//    我们要编写一个遵循SpringData给定的方法名的格式
//    SpringData能够根据我们编写的方法名，推断出查询意图，自动生成能够我完成这个查询的语句完成功能
//    query表示查询，类似数据库中的select语句
//    Items/Item 表示要查询的实体类的名称
//    By表示通过，根据；标记开始设置查询条件的关键字，等价于sql的where
//    Title,代表需要查询的字段，可以是实体类中的任何字段
//    Matches匹配，表示指定查询的条件，即匹配的字段，类似sql中的like
    Iterable<Item> queryItemsByTitleMatches(String title);


    //    多条件查询
//    多个条件之间要用and或者or进行分隔，表示多个条件之间的逻辑关系
//    我们使用title和brand字段进行多条件查询
//    参数的数量匹配查询字段的数量，且参数会按顺序给第一个字段赋值
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(String title, String brand);


    //    排序查询
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title, String brand);


//    分页查询
//    要执行分页查询，需要将返回值类型修改为Page
//    这个类型的对象支持保存所有查询结果的同时，保存分页信息，例如每页条数，页数等
//    参数方面，需要添加Pageable类型的参数，确定分页查询的页码和每条页数
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title, String brand, Pageable pageable);


}